home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / FPSE_src / system / amiga / plugin / gpu / cache.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-01  |  3.1 KB  |  142 lines

  1. #include "gpulocal.h"
  2.  
  3. #define   CACHE_MAX 16
  4.  
  5. // User-defined types
  6. typedef struct {
  7.     INT16  *Texture;
  8.     UINT32  tpage,clutid;
  9. } TextureCache;
  10.  
  11. static UINT16       rgbtbl[65536]; /* bgr -> rgb */
  12. static TextureCache tcache[CACHE_MAX];
  13. static int          tcache_index = 0;
  14.  
  15. void CacheInit(void)
  16. {
  17.     int i,r,g,b;
  18.  
  19.     for(b=i=0;b<32;b++)
  20.         for(g=0;g<32;g++)
  21.             for(r=0;r<32;r++,i++)
  22.                 rgbtbl[i] = (r<<10) | (g<<5) | b;
  23.  
  24.     for(i=0;i<32768;i++)
  25.         rgbtbl[i+32768]=rgbtbl[i] | 0x8000;
  26.  
  27.     tcache[0].Texture = (INT16 *)malloc(256*256*CACHE_MAX*sizeof(INT16));
  28.     tcache[0].tpage = tcache[0].clutid = -1;
  29.     for (i=1; i<CACHE_MAX; i++)
  30.     {
  31.         tcache[i].Texture = tcache[0].Texture + 256*256*i;
  32.         tcache[i].tpage = tcache[i].clutid = -1;
  33.     }
  34. }
  35.  
  36. void CacheDeinit(void)
  37. {
  38.     free(tcache[0].Texture);
  39. }
  40.  
  41. static void pixel2texel(UINT16 *t, UINT16 *p,int n)
  42. {
  43.     do {
  44.         *t++=rgbtbl[*p++];
  45.     } while(--n);
  46. }
  47.  
  48. static void load_texture(INT16 *texture,int tpage,int clut)
  49. {
  50.     UINT16 *ctbl,*tex;
  51.     UINT16 *t,ctbl2[256];
  52.     int x,y,mode;
  53.  
  54.     mode = (tpage>>7)&3;
  55.  
  56.     ctbl = vram+(clut&0x7fff)*16;
  57.     tex  = vram+(tpage&15)*64 + (tpage&16)*16*FRAME_W;
  58.     t = texture;
  59.  
  60.     switch (mode) {
  61.     case 0: // 4bit
  62.         pixel2texel(ctbl2,ctbl,16);
  63.         for(y=0;y<256;y++) {
  64.             for(x=0;x<256;x+=4) {
  65.                 int c = *tex++;
  66.                 t[0] = ctbl2[c&15];
  67.                 t[1] = ctbl2[(c>>4)&15];
  68.                 t[2] = ctbl2[(c>>8)&15];
  69.                 t[3] = ctbl2[(c>>12)];
  70.                 t+=4;
  71.             }
  72.             tex += FRAME_W-256/4;
  73.         }
  74.         break;
  75.  
  76.     case 1: // 8bit
  77.         pixel2texel(ctbl2,ctbl,256);
  78.         for(y=0;y<256;y++) {
  79.             for(x=0;x<256;x+=2) {
  80.                 int c = *tex++;
  81.                 t[0] = ctbl2[c&255];
  82.                 t[1] = ctbl2[c>>8];
  83.                 t+=2;
  84.             }
  85.             tex += FRAME_W-256/2;
  86.         }
  87.         break;
  88.  
  89.     case 2: /* 16bit */
  90.         for(y=0;y<256;y++) {
  91.             pixel2texel(t,tex,256);
  92.             tex += FRAME_W;
  93.             t += 256;
  94.         }
  95.         break;
  96.     }
  97. }
  98.  
  99. INT16 *get_texture(UINT32 tpage, UINT32 clut)
  100. {
  101.     TextureCache *tc;
  102.     int           tchanged,cchanged,i;
  103.  
  104.     tpage&=(3<<7)|31;
  105.     clut &= 0x7fff;
  106.  
  107.     tchanged = tpage_changed(tpage);
  108.     cchanged = clut_changed(clut);
  109.  
  110.     if (tchanged | cchanged) {
  111. // parge cache
  112.         for(i=0, tc = tcache;i<CACHE_MAX;i++, tc++) {
  113.             if ((cchanged && tc->clutid==clut ) ||
  114.                 (tchanged && tc->tpage==tpage)) {
  115.                     tc->clutid = -1;
  116.                     tc->tpage  = -1;
  117.             }
  118.         }
  119.     } else {
  120. // search cache
  121.         for(i=0, tc = tcache;i<CACHE_MAX;i++, tc++) {
  122.             if (tc->tpage==tpage && tc->clutid==clut)
  123.                 return tc->Texture;
  124.         }
  125.     }
  126.  
  127. #if 0
  128.     printf("Texture Cache miss hit tpage=%04x clut=%04x idx->%d\n",
  129.             (int)tpage,(int)clut,(int)tcache_index);
  130. #endif
  131.  
  132.     tc = &tcache[tcache_index];
  133.     if (++tcache_index >= CACHE_MAX) tcache_index = 0;
  134.  
  135.     tc->clutid = clut;
  136.     tc->tpage  = tpage;
  137.  
  138.     load_texture(tc->Texture,tpage,clut);
  139.  
  140.     return tc->Texture;
  141. }
  142.